var websocket;

function init(url, handler) {
  websocket = new WebSocket(url);
  websocket.onopen = function (evt) {
    onOpen(evt)
  };
  websocket.onclose = function (evt) {
    onClose(evt)
  };
  websocket.onmessage = function (evt) {
    onMessage(evt, handler);
  };
  websocket.onerror = function (evt) {
    onError(evt)
  };
}

function onOpen(evt) {
  console.log("CONNECTED");
}

function onClose(evt) {
  console.log("DISCONNECTED");
}

function onError(evt) {
  console.log("error event：", evt.data);
}

function onMessage(evt, handler) {
  let message = evt.data;
  console.log("got message: " + message);
  // 只要有数据，那就说明连接正常
  ws_heartCheck.reset().start();
  if ('heartbeat' !== message) {
    handler(message);
  }
}

// WebSocket心跳检测
var ws_heartCheck = {
  timeout: 5000,			// 5秒一次心跳
  timeoutObj: null,		// 执行心跳的定时器
  serverTimeoutObj: null,	// 服务器超时定时器
  reset: function () {		// 重置方法
    clearTimeout(this.timeoutObj);
    clearTimeout(this.serverTimeoutObj);
    return this;
  },
  start: function () {		// 启动方法
    let self = this;
    this.timeoutObj = setTimeout(function () {
      // 这里发送一个心跳信息，后端收到后，返回一个消息，在onmessage拿到返回的心跳（信息）就说明连接正常
      if (websocket) {
        send("heartbeat");
      }
      // 如果超过一定时间还没重置，说明后端主动断开了
      self.serverTimeoutObj = setTimeout(function () {
        // 如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        close();
      }, self.timeout);
    }, this.timeout);
  }
}

function send(message) {
  if (websocket) {
    websocket.send(message);
  }
}

function close() {
  if (websocket) {
    websocket.close();
    websocket = undefined;
  }
}

module.exports = {init, send, close}
